import axios from 'axios'
import QS from 'qs'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getToken, removeToken } from '@/utils/auth'

const service = axios.create({
  baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : '', // 请求前缀
  timeout: 20000, // 请求超时时间
  crossDomain: true, // 设置cross跨域
  withCredentials: true// 设置cross跨域 并设置访问权限 允许跨域携带cookie信息
})

// post请求头
// application/json（JSON数据格式）
// service.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'

// application/x-www-form-urlencoded（浏览器的原生 form 表单）
// service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

// multipart/form-data （表单上传文件）
// service.defaults.headers.post['Content-Type'] = 'multipart/form-data; charset=utf-8'

// 防止重复请求
// const removepending = (config) => {

// }

// 请求拦截器
service.interceptors.request.use(
  // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
  // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断

  config => {
    config.headers.Authorization = 'Basic c2lyZW5naW5lOnNpcmVuZ2luZQ=='
    const token = getToken()
    token && (config.headers.Authorization = `Bearer ${token}`)
    return config
  },
  error => {
    return Promise.error(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (axios.isCancel(error)) {
      return new Promise(() => { })
    }
    if (error.message.includes('timeout')) {
      Message.error('网络超时')
      return Promise.reject(error)
    }
    if (error.response.status) {
      switch (error.response.status) {
        case 404:
          Message.error('网络请求不存在')
          break
        // case 424:
        //   removeToken()  // token失效清除token
        //   console.log(router.push({path: '/login'}))
        //   Message.error('登录凭证已过期，请重新登录！')
        //   // store.commit('user/SET_RELOGIN', true)
        //   break
        // 其他错误，直接抛出错误提示
        // default:
        //   Message.error('Error')
      }
      return Promise.reject(error.response)
    }
  }
)

const timer = new Date().getTime().toString()
/**
   * get方法，对应get请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
function GET(url, params) {
  return new Promise((resolve, reject) => {
    service.get(url + `?t=${timer}`, {
      params: params
    })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}
/**
   * post方法，对应post请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
function POST(url, params, options = {}) {
  service.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'
  return new Promise((resolve, reject) => {
    service.post(url, params, options)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}
/**
   * post方法，对应post-form请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */

function POSTFORM(url, params, options = {}) {
  service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
  return new Promise((resolve, reject) => {
    service.post(url, QS.stringify(params), options)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

export {
  GET,
  POST,
  POSTFORM
}
